from tkinter import N


def create_board(size=15):
    """创建指定大小的五子棋棋盘（默认15x15）"""
    # 用二维列表表示棋盘，初始值为0（空），1代表黑棋，2代表白棋
    return [[0 for _ in range(size)] for _ in range(size)]

def print_board(board):
    """打印棋盘，格式化显示坐标和棋子"""
    size = len(board)
    # 打印顶部列坐标（0~size-1）
    print("  " + " ".join(f"{i:2}" for i in range(size)))
    print(" +" + "-" * (3 * size - 1) + "+")
    
    for row in range(size):
        # 打印行坐标 + 竖线分隔的棋子
        print(f"{row:2}|", end="")
        for col in range(size):
            if board[row][col] == 0:
                print("  |", end="")  # 空位置
            elif board[row][col] == 1:
                print("● |", end="")  # 黑棋
            else:
                print("○ |", end="")  # 白棋
        print()
        print(" +" + "-" * (3 * size - 1) + "+")

def check_win(board, row, col, player):
    """判断当前落子后是否获胜（核心逻辑）"""
    size = len(board)
    directions = [
        [(0, 1), (0, -1)],   # 水平方向
        [(1, 0), (-1, 0)],   # 垂直方向
        [(1, 1), (-1, -1)],  # 对角线（左上→右下）
        [(1, -1), (-1, 1)]   # 反对角线（右上→左下）
    ]
    
    for dirs in directions:
        count = 1  # 当前落子算1颗
        # 遍历每个方向的两个相反方向
        for dr, dc in dirs:
            r, c = row + dr, col + dc
            # 连续统计同色棋子
            while 0 <= r < size and 0 <= c < size and board[r][c] == player:
                count += 1
                r += dr
                c += dc
                if count >= 5:  # 达到5颗即获胜
                    return True
    return False

def gomoku_game():
    """五子棋游戏主流程"""
    print("===== 五子棋游戏 =====")
    print("规则：双人对战，黑棋（●）先落子，率先连成5子一线者获胜")
    print("输入格式：行号 列号（例如：7 7，中间用空格分隔）")
    print("输入 'quit' 可退出游戏\n")
    
    # 选择棋盘大小
    while True:
        try:
            size_input = input("请输入棋盘尺寸（默认15，最小5）：").strip()
            size = int(size_input) if size_input else 15
            if size >= 5:
                break
            print("棋盘尺寸不能小于5，请重新输入！")
        except ValueError:
            print("输入无效，请输入正整数！")
    
    board = create_board(size)
    current_player = 1  # 1=黑棋，2=白棋
    player_symbol = {1: "黑棋（●）", 2: "白棋（○）"}
    
    while True:
        print_board(board)
        print(f"\n当前回合：{player_symbol[current_player]}")
        
        # 获取用户落子位置
        while True:
            move = input("请输入落子坐标（行 列）：").strip()
            if move.lower() == "quit":
                print("游戏已退出！")
                return
            
            # 解析输入（行 列）
            parts = move.split()
            if len(parts) != 2:
                print("输入格式错误！请输入：行号 列号（中间空格分隔）")
                continue
            
            try:
                row = int(parts[0])
                col = int(parts[1])
                # 验证坐标是否在棋盘范围内
                if 0 <= row < size and 0 <= col < size:
                    # 验证该位置是否为空
                    if board[row][col] == 0:
                        break
                    else:
                        print("该位置已落子，请选择其他位置！")
                else:
                    print(f"坐标超出范围！请输入0~{size-1}之间的数字")
            except ValueError:
                print("输入无效！行号和列号必须是整数")
        
        # 落子（更新棋盘）
        board[row][col] = current_player
        
        # 判断是否获胜
        if check_win(board, row, col, current_player):
            print_board(board)
            print(f"\n🎉 恭喜！{player_symbol[current_player]}获胜！")
            break
        
        # 判断是否平局（棋盘满了但无人获胜）
        if all(board[row][col] != 0 for row in range(size) for col in range(size)):
            print_board(board)
            print("\n🤝 棋盘已满，游戏平局！")
            break
        
        # 切换玩家
        current_player = 2 if current_player == 1 else 1

# 启动游戏
if __name__ == "__main__":
    gomoku_game()

    